package com.rock.code.system.role.controller;

import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageInfo;
import com.rock.code.base.controller.BaseController;
import com.rock.code.base.domain.AjaxJson;
import com.rock.code.base.domain.Constants;
import com.rock.code.common.excel.ExportExcel;
import com.rock.code.common.exceptions.SystemException;
import com.rock.code.common.pager.Page;
import com.rock.code.common.tree.ItemNode;
import com.rock.code.system.role.domain.TbSysRole;
import com.rock.code.system.role.service.TbSysRoleService;
import com.rock.code.system.user.domain.TbSysLoginmsg;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 角色管理
 *
 * @author wangwenbo
 * @date 2018/06/14
 */
@Controller
@RequestMapping("/tbSysRole")
public class TbSysRoleController extends BaseController {

    /**
     * The tbSysRoleServiceImpl
     */
    @Resource
    private TbSysRoleService tbSysRoleServiceImpl;

    /**
     * Dispatch.
     *
     * @return the string
     * @throws Exception the exception
     * @author wangwenbo
     * @date 2018/06/14
     */
    @RequestMapping("")
    public String dispatch() throws Exception {
        return "system/role/tbSysRoleList";
    }

    /**
     * queryPageList
     *
     * @return the page info
     * @throws Exception the exception
     * @author wangwenbo
     * @date 2018/06/14
     */
    @ResponseBody
    @RequestMapping(value = "/queryPageList", method = RequestMethod.POST)
    public PageInfo<TbSysRole> queryPageList() throws Exception {
        Map<String, Object> param = this.getRequestMapSingle();
        Page page = new Page(request);
        PageInfo pageInfo = null;
        try {
            param.put("isDelete", Constants.DELETE_N);
            pageInfo = tbSysRoleServiceImpl.queryPageList(page, param);
        } catch (Exception e) {
            e.printStackTrace();
            throw new SystemException(e);
        }
        return pageInfo;
    }

    /**
     * querySingle
     *
     * @return TbSysRole
     * @throws Exception the exception
     * @author wangwenbo
     * @date 2018/06/14
     */
    @ResponseBody
    @RequestMapping(value = "/querySingle", method = RequestMethod.POST)
    public TbSysRole querySingle() throws Exception {
        Map<String, Object> param = this.getRequestMapSingle();
        TbSysRole tbSysRole = null;
        try {
            tbSysRole = tbSysRoleServiceImpl.queryByParaMap(param);
        } catch (Exception e) {
            e.printStackTrace();
            throw new SystemException(e);
        }
        return tbSysRole;
    }

    /**
     * Query tree data.
     *
     * @param parentCode the input name
     * @return the json object
     * @throws Exception the exception
     * @author wangwenbo
     * @date 2018/06/14
     */
    @ResponseBody
    @RequestMapping(value = "/queryTreeData", method = RequestMethod.GET)
    public AjaxJson queryTreeData(String parentCode) throws Exception {
        try {
            Map<String, Object> param = new HashMap<String, Object>();
            param.put("parentId", parentCode);
            param.put("isDelete", Constants.DELETE_N);
            List<ItemNode> rows = tbSysRoleServiceImpl.queryTreeData(param);
            ajaxJson.setResult(rows);
        } catch (Exception e) {
            e.printStackTrace();
            throw new SystemException(e);
        }
        return ajaxJson;
    }

    /**
     * Save.
     *
     * @param tbSysRole the TbSysRole
     * @return the ajax json
     * @throws Exception the exception
     * @author wangwenbo
     * @date 2018/06/14
     */
    @ResponseBody
    @RequestMapping(value = "/save", method = RequestMethod.POST)
    public AjaxJson save(@RequestBody TbSysRole tbSysRole) throws Exception {
        try {
            TbSysLoginmsg sessionUser = getSessionUser();

            // 设置默认值
            tbSysRole.setGrantEnable("1");
            tbSysRole.setParentId(tbSysRole.getParentCode());

            if (isNotEmpty(tbSysRole.getRoleId())) {
                tbSysRole.setIsDelete(Constants.DELETE_N);
                tbSysRole.setModifier(sessionUser.getLoginCode());
                tbSysRole.setModifieDate(new Date());
                tbSysRoleServiceImpl.update(tbSysRole);
            } else {
                // 根据父节点设置子节点的级别
                TbSysRole parentNode = null;
                Map<String, Object> map = new HashMap<>();
                map.put("roleId", tbSysRole.getParentId());
                map.put("isDelete", Constants.DELETE_N);
                parentNode = tbSysRoleServiceImpl.queryByParaMap(map);
                tbSysRole.setTreeLevel(parentNode.getTreeLevel() + 1);
                // 设置子节点其他属性
                tbSysRole.setIsDelete(Constants.DELETE_N);
                tbSysRole.setCreater(sessionUser.getLoginCode());
                tbSysRole.setCreateDate(new Date());
                tbSysRole.setModifier(sessionUser.getLoginCode());
                tbSysRole.setModifieDate(new Date());
                tbSysRoleServiceImpl.insert(tbSysRole);
                // 更新父节点
                if (parentNode.getIsLeaf() == 1) {
                    parentNode.setIsLeaf(0);
                    tbSysRoleServiceImpl.update(parentNode);
                }
            }
            return ajaxJson;
        } catch (Exception e) {
            e.printStackTrace();
            throw new SystemException(e);
        }
    }

    /**
     * Delete.
     *
     * @param ids the ids
     * @return the ajax json
     * @throws Exception the exception
     * @author wangwenbo
     * @date 2018/06/14
     */
    @ResponseBody
    @RequestMapping(value = "/delete", method = RequestMethod.POST)
    public AjaxJson delete(@RequestParam String ids) throws Exception {
        try {
            String[] roleIds = ids.split(",");
            TbSysLoginmsg sessionUser = getSessionUser();
            for (String roleId : roleIds) {
                // 根据id查找子节点
                Map<String, Object> param = new HashMap<>();
                param.put("roleId", roleId);
                param.put("isDelete", Constants.DELETE_N);
                TbSysRole node = tbSysRoleServiceImpl.queryByParaMap(param);
                // 删除子节点
                TbSysRole tbSysRole = new TbSysRole();
                tbSysRole.setRoleId(roleId);
                tbSysRole.setIsDelete(Constants.DELETE_Y);
                tbSysRole.setModifier(sessionUser.getLoginCode());
                tbSysRole.setModifieDate(new Date());
                tbSysRoleServiceImpl.update(tbSysRole);
                // 根据子节点的parentCode查询子节点数目
                Map<String, Object> rowParam = new HashMap<String, Object>();
                rowParam.put("parentId", node.getParentCode());
                rowParam.put("isDelete", Constants.DELETE_N);
                List<ItemNode> rows = tbSysRoleServiceImpl.queryTreeData(rowParam);
                if (rows.size() == 0){
                    // 更新父节点
                    Map<String,Object> parentParm = new HashMap<String, Object>();
                    parentParm.put("roleCode", node.getParentCode());
                    parentParm.put("isDelete", Constants.DELETE_N);
                    TbSysRole parentDept = tbSysRoleServiceImpl.queryByParaMap(parentParm);
                    parentDept.setIsLeaf(new Integer(1));
                    tbSysRoleServiceImpl.update(parentDept);
                }
            }
            return ajaxJson;
        } catch (Exception e) {
            e.printStackTrace();
            throw new SystemException(e);
        }
    }

    /**
     * Exp excel.
     *
     * @return the ajax json
     * @throws Exception the exception
     * @author wangwenbo
     * @date 2018/01/12
     */
    @ResponseBody
    @RequestMapping(value = "/expExcel", method = RequestMethod.POST)
    public AjaxJson expExcel() throws Exception {
        try {
            Map<String, Object> param = this.getRequestMapSingle();
            String[] titles = (String[]) param.get("titles[]");
            String[] fields = (String[]) param.get("fields[]");
            Page page = new Page((String) param.get("sidx"), (String) param.get("sord"));
            param.put("isDelete", Constants.DELETE_N);
            ExportExcel ee = new ExportExcel();
            List rows = tbSysRoleServiceImpl.queryListByOrder(page, param);
            String path = ee.exportExcel(request, response, 40000, titles, fields, rows, TbSysRole.class.getName());
            ajaxJson.setResult(path);
        } catch (Exception e) {
            e.printStackTrace();
            throw new SystemException(e);
        }
        return ajaxJson;
    }

    /**
     * Check input field.
     *
     * @param inputName  the input name
     * @param inputValue the input value
     * @return the json object
     * @throws Exception the exception
     * @author wangwenbo
     * @date 2018/01/12
     */
    @ResponseBody
    @RequestMapping(value = "/checkInputField", method = RequestMethod.POST)
    public JSONObject checkInputField(String inputName, String inputValue) throws Exception {
        try {
            Map<String, Object> param = new HashMap<String, Object>();
            param.put(inputName, inputValue);
            param.put("isDelete", Constants.DELETE_N);
            List rows = tbSysRoleServiceImpl.queryListByParaMap(param);
            if (rows != null && rows.size() > 0) {
                json.put("valid", false);
            } else {
                json.put("valid", true);
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new SystemException(e);
        }
        return json;
    }
}
